#ifndef NETLIB_TIMER_H
#define NETLIB_TIMER_H

// 定时器类

#include "Atomic.h"
#include "Timestamp.h"
#include "Callbacks.h"

namespace netlib
{

namespace net
{

class Timer : noncopyable // 定时器类，不可拷贝
{
public:
    Timer(TimerCallback cb, Timestamp when, double interval)
        : callback_(std::move(cb)),
        expiration_(when),
        interval_(interval),
        repeat_(interval > 0.0),
        sequence_(s_numCreated_.incrementAndGet())
    { }

    void run() const { callback_(); } // 调用回调函数

    Timestamp expiration() const  { return expiration_; } // 返回下一次超时时间

    bool repeat() const { return repeat_; } // 查询是否开启重复

    int64_t sequence() const { return sequence_; } // 返回该定时器序号

    void restart(Timestamp now); // 重启定时器

    static int64_t numCreated() { return s_numCreated_.get(); } // 返回已创建的定时器个数

private:
    const TimerCallback callback_;          // 定时器回调函数
    Timestamp expiration_;                  // 下一次的超时时刻
    const double interval_;                 // 超时时间，一次性定时器设为0
    const bool repeat_;                     // 是否重复
    const int64_t sequence_;                // 定时器序号

    static AtomicInt64 s_numCreated_;       // 原子计数类已经创建的定时器数量

}; // class Timer end

} // namespace net end

} // namespace netlib end

#endif